package exercises.leetcode;

import java.util.Arrays;

/**
 * <a href="https://leetcode-cn.com/problems/first-unique-character-in-a-string/">
 * 387. 字符串中的第一个唯一字符</a>
 *
 * <p><span color="#87CEEB">描述:</span>
 * 给定一个字符串，找到它的第一个不重复的字符，并返回它的索引。如果不存在，则返回 -1。
 * <p>
 *  
 * <p>
 * 示例：
 * <p>
 * s = "leetcode"
 * 返回 0
 * <p>
 * s = "loveleetcode"
 * 返回 2
 *  
 * <p>
 * 提示：你可以假定该字符串只包含小写字母。
 *
 * @author or2
 * @date 2021年09月24日 时间: 12:27
 */
public class No387 {
    public int firstUniqChar(String s) {
        char[] in2Chars = s.toCharArray();
        short[] indexOfLetter = new short[26];
        Arrays.fill(indexOfLetter, (short) -2);

        for (short i = 0; i < in2Chars.length; i++) {
            if (indexOfLetter[in2Chars[i] - 'a'] == -2) {
                indexOfLetter[in2Chars[i] - 'a'] = i;
            } else {
                indexOfLetter[in2Chars[i] - 'a'] = -1;
            }
        }

        int ans = Short.MAX_VALUE;
        for (short i : indexOfLetter) {
            if (i < 0) {
                continue;
            }
            if (ans > i) {
                ans = i;
            }
        }

        return ans == Short.MAX_VALUE? -1: ans;
    }

    public int firstUniqCharOptimize(String s) {
        short[] array = new short[26];
        char[] chars = s.toCharArray();
        for (char aChar : chars) {
            array[aChar - 'a']++;
        }
        for (int i = 0; i < chars.length; i++) {
            if (array[chars[i] - 'a'] == 1) {
                return i;
            }
        }
        return -1;
    }
}
